package com.zf.nio.channel;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.StandardCharsets;

/**
 * @author Zhou Feng
 */
public class FileChannelDemo02 {
    // 向 FileChannel中写数据
    public static void main(String[] args) {
        try(RandomAccessFile file = new RandomAccessFile("d:/a.txt", "rw");) {
            // 创建FileChannel
            FileChannel channel = file.getChannel();
            // 创建Buffer
            ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
            // 向buffer 中写入数据
            byteBuffer.put("哈哈哈哈哈".getBytes(StandardCharsets.UTF_8));

            // 将写模式 转为 读模式 ， 从缓冲区读取数据
            // 设置 limit = position; position=0 ，以便读取刚刚写入的数据
            byteBuffer.flip();
            // 向channel中写入数据
            //因为无法保证 write()方法一次能向 FileChannel 写入多少字节，因此需要重复调用 write()方法，直到 Buffer 中已经没有尚未写入通道的字节
            while (byteBuffer.hasRemaining()){
                channel.write(byteBuffer);
            }
            //用完 FileChannel 后必须将其关闭
            channel.close();
            System.out.println("写完了");
        } catch (IOException ignored){

        }
    }
}
